Rust Bevy を使ってみたメモ テトリスを作ってみる①

Rust Bevy を使ってみたメモ テトリスを作ってみる①

bevyの使い方が少しわかってきたところで、Rustゲームエンジンbevyでテトリスを作る | makibishi throw この記事を参考にしながらテトリスを作ってみようかなと思います。

とりあえず今回は、ウィンドウを表示し、任意の位置に正方形を表示するというところまでやっています。
bevyのバージョン:0.13.0

参考:Rustゲームエンジンbevyでテトリスを作る | makibishi throw
   List of all items in this crate (docs.rs)

use bevy::prelude::*;

//1マスの高さと幅:40ピクセル
const SQUARE_HEIGHT: i32 = 40;
const SQUARE_WIDTH : i32 = 40;

//縦20マス、横10マス
const FIELD_HEIGHT: i32 = 20;
const FIELD_WIDTH : i32 = 10;

//ウィンドウの大きさ
const WINDOW_HEIGHT: i32 = SQUARE_HEIGHT * FIELD_HEIGHT;
const WINDOW_WIDTH : i32 = SQUARE_WIDTH  * FIELD_WIDTH ;


//テトリミノの目印
#[derive(Component)]
struct Tetrimino;

//テトリミノ等の位置を保持するコンポーネント(左下を原点とする)
#[derive(Component)]
struct Position {
    x: i32,
    y: i32,
}

//テトリミノバンドル
#[derive(Bundle)]
struct TetriminoBundle {
    tetrimino: Tetrimino,
    position : Position,
    sprite   : SpriteBundle,
}


fn debug() {
    println!("{} x {}", WINDOW_WIDTH, WINDOW_HEIGHT);
}


//カメラとテトリミノバンダルの生成
fn setup(
    mut commands: Commands
) {
    commands.spawn(Camera2dBundle::default());
    commands.spawn(TetriminoBundle {
        tetrimino: Tetrimino,
        position : Position {
            x: 0,
            y: 0,
        },
        sprite   : SpriteBundle {
            ..default()
        },
    });
}


//テトリミノバンダルのスプライトを調整
fn adjust (
    mut tetrimino_query: Query<(&Position, &mut Transform), With<Tetrimino>>
){
    let origin_x: i32 = WINDOW_WIDTH  / -2 + SQUARE_WIDTH  / 2;
    let origin_y: i32 = WINDOW_HEIGHT / -2 + SQUARE_HEIGHT / 2;

    tetrimino_query
        .iter_mut()
        .for_each(|(pos, mut trs)| {
            trs.translation = (
                (origin_x + pos.x * SQUARE_WIDTH) as f32,
                (origin_y + pos.y * SQUARE_WIDTH) as f32,
                0.0,
            ).into();
            trs.scale = (
                SQUARE_WIDTH  as f32,
                SQUARE_HEIGHT as f32,
                0.0
            ).into();
       });
}



fn main() {
    App::new()
        .add_plugins(DefaultPlugins.set(WindowPlugin {
            primary_window: Some(Window {
                title: "Tetrus".into(),
                resolution: (WINDOW_WIDTH as f32, WINDOW_HEIGHT as f32).into(),
                resizable: false,
                ..default()
            }),
            ..default()
        }))
        .add_systems(Startup, (debug, setup))
        .add_systems(Update, adjust)
        .run()
}

とりあえず記事の考え方を参考にしながら好き勝手書いている感じです。

1マスの大きさは40×40ピクセル、縦20マス、横10マスで作ってみたのですが、思ったより縦長になりました。本物のテトリスはテトリスフィールドの横にいろいろ表示してるから気にならなかったのか…

スプライトの部分絶対もっといい書き方あると思うんですけど思いつきませんでした…

ちなみにi32は符号付き32bitだそうで、u32の符号なし32bitを使うと型変換がめんどくさかったので勝手に変えちゃいました…なんか理由あったのかなぁ?今のところ不具合が出てないからヨシ!☞

次回もどんどん続きをやっていきますか

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です